我今天的規劃是 把 關於產品的資料表稍微設定一下。在一個開發之前,我們必須要資料庫有一些假資料,身為一個專業的開發人員,如果被其他人看到在資料庫一個一個的寫假數據看起來很low,所以我們今天來借助框架的好用小工具來幫助我們進行假資料的「播種」
首先在播種之前,我們先來創建一個「工廠」,這個工廠可以想像成:幫助我們定義要塞什麼樣的資料到資料庫之中。
基本上就是工廠裏頭會有模具,之後要播種的時候只要照著這個模具來做就好了的概念。
一樣我們透過指令來產生工廠:
php artisan make:factory ProductFactory
接著我們到工廠裏頭去定義需要塞入的規則:
這裡要注意,我們需要將目標model放到程式碼裡面 protected $model = Product::class;
這樣這個工廠才知道是針對哪個model所設計的模具。
Product的資料表很單純,只有名稱跟敘述視需要塞入的,因此我們就直接給文字並限定字數就好。
ProductFactory
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Product;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Product>
*/
class ProductFactory extends Factory
{
protected $model = Product::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => $this->faker->realText(10,true),
'description' => $this->faker->realText(50),
];
}
}
接下來我們要到Model的地方來寫入hasFactory。Product
注意:hasFactory 方法將在Database\Factories命名空間中查找類名與模型名匹配且後綴為Factory的工廠來使用。
如果這個規則不適用的話,可以依據官方文件來寫一個newFactory的function來覆蓋,並返回Factory。
因為我們的命名規則是適用的,所以就不用特別調整。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Product extends BaseModel
{
use HasFactory;
protected $table = 'products';
protected $guarded = [];
}
接下來我們要使用播種機了~
透過以下指令來產生seeder檔案:php artisan make:seeder ProductSeeder
接下來到 ProductSeeder
來設定:
首先,我們一樣要去use Product Model,因為我們要借助Factory來幫我們大量實例化。
接著,我們把資料表清空(可以做,可不做)
然後把資料塞進去,把要塞入的數量寫到count之中。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Product;
class ProductSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
\DB::table('products')->truncate();
Product::unguard();
Product::factory()->count(30)->create();
Product::reguard();
}
}
這裡我想補充一下關於:unguard、reguard
基本上Laravel 為了幫助我們更好的保護資料庫安全性,因此有針對"批量給值"這件事情進行保護,而unguard就是取消該安全機制,reguard就是恢復該安全機制。因此我們在factory大量創建資料的時候要先關閉,再開啟。
特別補充:基本上我們也會透過Model的設定來保護特定欄位,如果在model之中設定$fillable這個屬性,代表只能針對fillable設定的欄位進行資料調整。設定$guarded屬性代表保護該欄位,因此在guarded屬性中的欄位則無法進行資料調整。
舉個例子,User Model
:
直接翻譯,其實就是Code的意思:
1.只有name、email、password這三個屬性可以更新
2.password跟remember_token會被隱藏
3.email_verified_at會被強制轉換型態
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
好的,這時候我們的資料庫有基本的Product資料了,其他的產品相關的表,利用工廠建的話好像會有點複雜XD
我這裡就暫時跳過,我先用手動的方式把資料寫入XD,如果最後有時間我們再回過頭來寫
今天就先到這邊,明天用Laravel來取資料,然後丟給React來顯示基本的畫面列表吧,我還要想一下要怎麼應(硬)用到之前React學到的概念XD